package com.yYclass.exception;

import com.yYclass.util.JsonData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
//@RestControllerAdvice
@Slf4j
public class CustomExceptionHandler {
    /**
     * @ControllerAdvice 和 @RestControllerAdvice 都是 Spring 框架中用于增强控制器功能的注解，它们的主要区别在于处理异常和返回值的默认行为。
     *
     * @ControllerAdvice：
         * 这个注解主要用于全局处理控制器中的异常和绑定数据。
         * 它允许你定义全局的异常处理方法，通过 @ExceptionHandler 注解来标注。
         * 它也允许你定义全局的数据绑定处理器，通过 @InitBinder 注解来标注。
         * 对于返回值，它不会默认地将其转换为 JSON 或 XML，而是保持原样（例如，返回 ModelAndView）。
         * 因此，如果你在使用 @ControllerAdvice 的同时希望返回 JSON，你需要在方法上使用 @ResponseBody 注解。
     * @RestControllerAdvice：
         * @RestControllerAdvice 是 @ControllerAdvice 的一个特殊版本，专为 RESTful 风格的 Web 服务设计。
         * 它默认地将所有返回值转换为 JSON 或 XML（取决于你的消息转换器配置）。
         * 这意味着你不需要在每个方法上都使用 @ResponseBody 注解。
         * 它同样支持全局的异常处理和数据绑定。
         * 总的来说，如果你正在开发 RESTful Web 服务，并且希望全局地返回 JSON 或 XML，那么 @RestControllerAdvice 会是一个更好的选择。
         * 而如果你需要更多的灵活性，或者你的控制器方法不全是返回 JSON 或 XML，那么 @ControllerAdvice 可能会更适合你。
     *
     * 在使用这两个注解时，你还可以结合 @ResponseBody、@ExceptionHandler 和 @InitBinder 等其他注解来提供更丰富的全局处理逻辑。
     * @param e
     * @return
     */

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public JsonData handler(Exception e){

        if(e instanceof BizException){
            BizException bizException = (BizException) e;
            log.error("[业务异常]{}",e);
            return JsonData.buildCodeAndMsg(bizException.getCode(),bizException.getMsg());
        }else {
            log.error("[系统异常]{}",e);
            return JsonData.buildError("系统异常");
        }

    }
}
